#!/usr/local/python3/bin/python3
# 单例模式
import logging
import os

class __MmsLogger(object):
    __instance=None          #通过数据属性来记录用户调用类的方法实例化的状态，调用前状态为Nnoe
    def __init__(self, log_dir, log_level, log_file_name):
        self.log_dir=log_dir
        self.log_level=log_level
        self.log_file_name=log_file_name
        
        self.logger_obj = logging.getLogger()                        #创建一个logger对象，它提供了应用程序可以直接使用的接口，其类型为“<class 'logging.RootLogger'>”；
        self.logger_obj.setLevel(logging.DEBUG)
        fh = logging.FileHandler(os.path.join(self.log_dir, self.log_file_name))          #创建一个文件输出流；
        
        #定义文件输出流的告警级别； CRITICAL > ERROR > WARNING > INFO > DEBUG
        if log_level == 'DEBUG':
            fh.setLevel(logging.DEBUG)
        elif log_level == 'INFO':
            fh.setLevel(logging.INFO)
        elif log_level == 'WARNING':
            fh.setLevel(logging.WARNING)
        elif log_level == 'ERROR':
            fh.setLevel(logging.ERROR)
        else:
            fh.setLevel(logging.CRITICAL)
        
        ch = logging.StreamHandler()                           #创建一个屏幕输出流；
        ch.setLevel(logging.DEBUG)  #定义屏幕输出流的告警级别；
        
        formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')        #自定义日志的输出格式，这个格式可以被文件输出流和屏幕输出流调用；
        fh.setFormatter(formater)                                #添加格式花输出，即调用我们上面所定义的格式，换句话说就是给这个handler选择一个格式；
        ch.setFormatter(formater)
        
        self.logger_obj.addHandler(fh)                               #logger对象可以创建多个文件输出流fh和屏幕输出流ch
        self.logger_obj.addHandler(ch)
    
    def debug(self, msg):
        self.logger_obj.debug(msg)
        
    def info(self, msg):
        self.logger_obj.info(msg)
        
    def warning(self, msg):
        self.logger_obj.warning(msg)
        
    def error(self, msg):
        self.logger_obj.error(msg)
        
    def critical(self, msg):
        self.logger_obj.critical(msg)
    
    #在类当中定义了一个类方法
    @classmethod
    def get_logger(cls, log_dir='.', log_level='DEBUG', log_file_name='mms.log'):              #-----------------------将该方法装饰成由类来调用的方法，类来调用将类自动传入
        if cls.__instance is None:   #-----------------------判断该类是否是首次调用该方法，是则返回True
            cls.__instance=cls(log_dir, log_level, log_file_name)          #类从配置文件中读参数，实例化出的实例(实例即调用类产生的对象)

        return cls.__instance        #-----------------------当该方法是第一次和不是第一次被类调用，则返回的结果均是cls.__instance
        
if __name__ == "__main__":
    mylogger = get_mms_logger(log_dir=".", log_level='INFO', log_file_name='zwt_mms.log')
    
    mylogger.debug("debugdebugdebugdebug")
    mylogger.info("infoinfoinfoinfo")
    mylogger.error("errorerrorerrorerrorerror")
    print("mylogger:", mylogger)
    
    myseclogger = get_mms_logger()
    myseclogger.debug("debugdebugdebugdebug")
    myseclogger.info("infoinfoinfoinfo")
    myseclogger.error("errorerrorerrorerrorerror")
    print("myseclogger:", myseclogger)
    

#外部方法
def get_logger(log_dir='.', log_level='DEBUG', log_file_name='mms.log'):
    return __MmsLogger.get_logger(log_dir, log_level, log_file_name)


#mmslogger = MmsLogger.get_mms_logger()

